// 包名保持你项目里的原样
package no.nordicsemi.android.nrfmesh.auth.session;

import android.content.Context;
import android.content.SharedPreferences;

/**
 * 会话管理（向后兼容版）
 *
 * 功能：
 * 1) 兼容老项目里直接调用的 uid()/name()/role()、旧的偏好键（uid/role/name）
 * 2) 同时写入新键（sess_id/sess_role/sess_name）
 * 3) 提供“一次性跳过自动登录”的闩锁（logout 后生效、被 AuthActivity 消费一次）
 *
 * 使用要点：
 * - 登录成功：save(uid, role, displayName)
 * - 退出登录：clearAndSkipAutoLoginOnce()    ← *推荐*：清空会话并设置“跳过一次自动登录”
 * - AuthActivity 启动时：consumeSkipAutoLoginOnce() 读取并消费闩锁
 */
public final class SessionManager {

    private static final String PREF_NAME = "session";

    // 旧键（你的其它文件正在用）
    private static final String K_UID_OLD  = "uid";
    private static final String K_ROLE_OLD = "role";
    private static final String K_NAME_OLD = "name";

    // 新键（语义更清晰）
    private static final String K_ID_NEW   = "sess_id";
    private static final String K_ROLE_NEW = "sess_role";
    private static final String K_NAME_NEW = "sess_name";

    // 一次性跳过自动登录的闩锁（退出登录时置 true，下一次启动鉴权页时消费掉）
    private static final String K_SKIP_AUTO_ONCE = "skip_auto_login_once";

    private final SharedPreferences sp;

    public SessionManager(Context context) {
        this.sp = context.getApplicationContext()
                .getSharedPreferences(PREF_NAME, Context.MODE_PRIVATE);
    }

    /** 登录成功后保存一次会话（向后兼容：两套键都写入） */
    public void save(long uid, String role, String displayName) {
        sp.edit()
                // 旧键
                .putLong(K_UID_OLD, uid)
                .putString(K_ROLE_OLD, role)
                .putString(K_NAME_OLD, displayName)
                // 新键
                .putLong(K_ID_NEW, uid)
                .putString(K_ROLE_NEW, role)
                .putString(K_NAME_NEW, displayName)
                .apply();
    }

    /** 是否已登录：任意一套键存在即可判真 */
    public boolean isLoggedIn() {
        return sp.contains(K_UID_OLD) || sp.contains(K_ID_NEW);
    }

    /** 退出登录：两套键都清掉，防止误判（不含闩锁） */
    public void clear() {
        sp.edit()
                .remove(K_UID_OLD).remove(K_ROLE_OLD).remove(K_NAME_OLD)
                .remove(K_ID_NEW).remove(K_ROLE_NEW).remove(K_NAME_NEW)
                .apply();
    }

    /**
     * 推荐退出登录调用：清空会话 + 设置“跳过自动登录一次”的闩锁
     * - 下次进入 AuthActivity 会读取并消费该闩锁，从而不触发自动登录
     */
    public void clearAndSkipAutoLoginOnce() {
        sp.edit()
                .remove(K_UID_OLD).remove(K_ROLE_OLD).remove(K_NAME_OLD)
                .remove(K_ID_NEW).remove(K_ROLE_NEW).remove(K_NAME_NEW)
                .putBoolean(K_SKIP_AUTO_ONCE, true)
                .apply();
    }

    /** 设置“跳过自动登录一次”的闩锁（如果你在别处想手动触发也可以调用） */
    public void setSkipAutoLoginOnce() {
        sp.edit().putBoolean(K_SKIP_AUTO_ONCE, true).apply();
    }

    /**
     * 消费一次性闩锁：返回 true 表示这次需要跳过自动登录，并且把闩锁清掉
     * - 只在 AuthActivity.onCreate/onNewIntent 这种“入口”位置调用
     */
    public boolean consumeSkipAutoLoginOnce() {
        boolean needSkip = sp.getBoolean(K_SKIP_AUTO_ONCE, false);
        if (needSkip) sp.edit().remove(K_SKIP_AUTO_ONCE).apply();
        return needSkip;
    }

    /** 只读不消费：Fragment 若要判断当前是否应该跳过自动登录可以用它（一般不需要） */
    public boolean peekSkipAutoLoginOnce() {
        return sp.getBoolean(K_SKIP_AUTO_ONCE, false);
    }

    /* -------- 旧代码在用的 API：保持方法名不变 -------- */

    /** 等价：uid()/id()/getId() —— 都返回同一个值 */
    public long uid()   { return readId(); }
    public long id()    { return readId(); }
    public long getId() { return readId(); }

    /** 旧代码在用：SessionManager.role() */
    public String role() { return readRole(); }

    /** 旧代码在用：SessionManager.name() */
    public String name() { return readName(); }

    /* -------- 可选的新风格 getter（如需） -------- */

    public String getRole() { return readRole(); }
    public String getName() { return readName(); }

    /* -------- 私有读取工具：优先读旧键，兼容新键 -------- */

    private long readId() {
        if (sp.contains(K_UID_OLD)) return sp.getLong(K_UID_OLD, -1L);
        return sp.getLong(K_ID_NEW, -1L);
    }

    private String readRole() {
        String v = sp.getString(K_ROLE_OLD, null);
        if (v != null) return v;
        return sp.getString(K_ROLE_NEW, null);
    }

    private String readName() {
        String v = sp.getString(K_NAME_OLD, null);
        if (v != null) return v;
        return sp.getString(K_NAME_NEW, null);
    }
}
